// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/*library: nnbd=true*/

T id<T>(T /*T%*/ t) => t;

class Class1<T> {
  const Class1();
}

class Class2<T> {
  final T field1;

  const Class2(
      this.
          /*normal|limited.Class2.T%*/
          /*verbose.library org-dartlang-test:///a/b/c/main.dart::Class2.T%*/
          field1);
}

class Class3<T, S> extends Class2<T> {
  final S field2;

  const Class3(
      T
          /*normal|limited.Class3.T%*/
          /*verbose.library org-dartlang-test:///a/b/c/main.dart::Class3.T%*/
          field1,
      this.
          /*normal|limited.Class3.S%*/
          /*verbose.library org-dartlang-test:///a/b/c/main.dart::Class3.S%*/
          field2)
      : super(field1);
}

class Class4<T, S> extends Class3<T, S> {
  final S field2;

  const Class4(
      T
          /*normal|limited.Class4.T%*/
          /*verbose.library org-dartlang-test:///a/b/c/main.dart::Class4.T%*/
          field1,
      S
          /*normal|limited.Class4.S%*/
          /*verbose.library org-dartlang-test:///a/b/c/main.dart::Class4.S%*/
          shadowedField2,
      this. /*normal|limited.Class4.S%*/
          /*verbose.library org-dartlang-test:///a/b/c/main.dart::Class4.S%*/
          field2)
      : super(field1, shadowedField2);
}

const nullConstant = /*null*/ null;
const trueConstant = /*true*/ true;
const falseConstant = /*false*/ false;
const intConstant = /*42*/ 42;
const doubleConstant = /*3.14*/ 3.14;
const stringConstant = /*foo*/ "foo";
const symbolConstant = /*#name*/ #name;
const privateSymbolConstant =
    /*normal|limited.#_privateName*/
    /*verbose.#library org-dartlang-test:///a/b/c/main.dart::_privateName*/
    #_privateName;
const listConstant1 = /*const <dynamic>[]*/ [];
const listConstant2 = <int>
    /*normal|limited.const <int>[]*/
    /*verbose.const <dart.core::int>[]*/
    [];
const listConstant3 = <int>
    /*normal|limited.const <int>[0]*/
    /*verbose.const <dart.core::int>[0]*/
    [0];
const listConstant4 = <int?>
    /*normal|limited.const <int?>[0, 1]*/
    /*verbose.const <dart.core::int?>[0, 1]*/
    [0, 1];
const setConstant1 = <int>
    /*normal|limited.const <int>{}*/
    /*verbose.const <dart.core::int>{}*/
    {};
const setConstant2 = <int>
    /*normal|limited.const <int>{0}*/
    /*verbose.const <dart.core::int>{0}*/
    {0};
const setConstant3 = <int?>
    /*normal|limited.const <int?>{0, 1}*/
    /*verbose.const <dart.core::int?>{0, 1}*/
    {0, 1};
const mapConstant1 = /*const <dynamic, dynamic>{}*/ {};
const mapConstant2 = <int, String>
    /*normal|limited.const <int, String>{}*/
    /*verbose.const <dart.core::int, dart.core::String>{}*/
    {};
const mapConstant3 = <int, String>
    /*normal|limited.const <int, String>{0: foo}*/
    /*verbose.const <dart.core::int, dart.core::String>{0: foo}*/
    {0: "foo"};
const mapConstant4 = <int, String?>
    /*normal|limited.const <int, String?>{0: foo, 1: bar}*/
    /*verbose.const <dart.core::int, dart.core::String?>{0: foo, 1: bar}*/
    {0: "foo", 1: "bar"};
const tearOffConstant =
    /*normal|limited.id*/
    /*verbose.library org-dartlang-test:///a/b/c/main.dart::id*/
    id;
const int Function(int) partialInitializationConstant =
    /*normal|limited.id<int>*/
    /*verbose.library org-dartlang-test:///a/b/c/main.dart::id<dart.core::int>*/
    id;
const boolHasEnvironmentConstant = const
    /*normal|limited.unevaluated{bool.hasEnvironment(foo)}*/
    /*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::bool.hasEnvironment(foo)}*/
    bool.hasEnvironment("foo");
const boolFromEnvironmentConstant = const
    /*normal|limited.unevaluated{bool.fromEnvironment(foo, defaultValue: true)}*/
    /*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::bool.fromEnvironment(foo, defaultValue: true)}*/
    bool.fromEnvironment("foo", defaultValue: true);
const intFromEnvironmentConstant = const
    /*normal|limited.unevaluated{int.fromEnvironment(foo, defaultValue: 87)}*/
    /*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::int.fromEnvironment(foo, defaultValue: 87)}*/
    int.fromEnvironment("foo", defaultValue: 87);
const stringFromEnvironmentConstant = const
    /*normal|limited.unevaluated{String.fromEnvironment(foo, defaultValue: bar)}*/
    /*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::String.fromEnvironment(foo, defaultValue: bar)}*/
    String.fromEnvironment("foo", defaultValue: "bar");
const instanceConstant1 = const
    /*normal|limited.const Class1<dynamic>{}*/
    /*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class1<dynamic>{}*/
    Class1();
const instanceConstant2 = const
    /*normal|limited.const Class1<int>{}*/
    /*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class1<dart.core::int>{}*/
    Class1<int>();
const instanceConstant3 = const
    /*normal|limited.const Class1<int>{}*/
    /*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class1<dart.core::int>{}*/
    Class1<int>();
const instanceConstant4 = const
    /*normal|limited.const Class2<int>{Class2.field1: 0}*/
    /*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class2<dart.core::int>{library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 0}*/
    Class2(0);
const instanceConstant5 = const
    /*normal|limited.const Class2<num>{Class2.field1: 42}*/
    /*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class2<dart.core::num>{library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 42}*/
    Class2<num>(42);
const instanceConstant6 = const
    /*normal|limited.const Class3<int, String>{Class3.field2: foo, Class2.field1: 42}*/
    /*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class3<dart.core::int, dart.core::String>{library org-dartlang-test:///a/b/c/main.dart::Class3.field2: foo, library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 42}*/
    Class3<int, String>(42, "foo");
const instanceConstant7 = const
    /*normal|limited.const Class4<int, String?>{Class4.field2: baz, Class3.field2: foo, Class2.field1: 42}*/
    /*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class4<dart.core::int, dart.core::String?>{library org-dartlang-test:///a/b/c/main.dart::Class4.field2: baz, library org-dartlang-test:///a/b/c/main.dart::Class3.field2: foo, library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 42}*/
    Class4<int, String?>(42, "foo", "baz");
